package network.server.handler.LibraryHandler;


import common.model.Entity.libraryEntity.Book;
import module.library.service.BookManagementService;
import module.library.service.impl.BookManagementServiceImpl;
import network.protocol.Request;
import network.protocol.Response;
import network.server.RequestHandler;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 图书管理业务请求处理器。
 *
 * <p>负责将网络层 {@link Request} 转换为对 {@link BookManagementService} 的调用，
 * 并返回统一的 {@link Response} 结果。</p>
 */

public class BookManagementHandler implements RequestHandler {

    /** 图书管理服务单例。 */
    private final BookManagementService bookManagementService= BookManagementServiceImpl.getInstance();

    /**
     * 入口处理方法。
     *
     * @param req 客户端请求
     * @return 封装后的响应对象，成功时携带业务数据，失败时携带错误信息
     */
    @Override
    public Response<?> handle(Request req){
        Map<String, Object> params = req.getParams();
        String action = (String) params.get("action");
        return switch(action){
                case "addNewBook"->handleAddNewBook(req);
                case "updateBookInfo"->handleUpdateBookInfo(req);
                case "deleteBook"->handleDeleteBook(req);
                case "manageStock"->handleManageStock(req);
                default->Response.error("不支持的操作类型");
            };
    }

    /* -------------------- 私有工具方法 -------------------- */

    /**
     * 安全获取字符串参数。
     *
     * @param map      参数集合
     * @param key      参数名
     * @param defaultVal 默认值
     * @return 去除两端空白后的字符串值，若为空则返回默认值
     */
    private static String getStr(Map<String, Object> map, String key, String defaultVal) {
        Object v = map.get(key);
        return (v != null) ? v.toString().trim() : defaultVal;
    }

    /**
     * 安全获取整数参数。
     *
     * @param map      参数集合
     * @param key      参数名
     * @param defaultVal 默认值
     * @return 转换后的整数值，若转换失败则返回默认值
     */
    private static int getInt(Map<String, Object> map, String key, int defaultVal) {
        Object v = map.get(key);
        if (v instanceof Number) return ((Number) v).intValue();
        try { return Integer.parseInt(v.toString()); } catch (Exception e) { return defaultVal; }
    }

    /* -------------------- 业务分支处理 -------------------- */

    /**
     * 处理“添加新书”请求。
     *
     * @param req 原始请求
     * @return 包含操作结果的 {@link Response}
     */
    private Response<?> handleAddNewBook(Request req) {
        Map<String, Object> params = req.getParams();
        Map<String, Object> bookInfo = (Map<String, Object>) params.get("bookInfo");
        String title = bookInfo.get("title").toString();
        String author = bookInfo.get("author").toString();
        String publisher = bookInfo.get("publisher").toString();
        String isbn = bookInfo.get("isbn").toString();
        int stock = getInt(bookInfo, "stock", 0);
        String category = bookInfo.get("category").toString();
        int available = getInt(bookInfo, "available", stock);
        return bookManagementService.addNewBook(title, author, publisher, isbn, stock, category, available);
    }

    /**
     * 处理“更新图书信息”请求（当前实现仅支持库存修改）。
     *
     * @param req 原始请求
     * @return 包含操作结果的 {@link Response}
     */
    private Response<?> handleUpdateBookInfo(Request req) {
        Map<String, Object> params = req.getParams();
        String isbn=params.get("isbn").toString();
        int stock = getInt(params, "stock", 0);
        return bookManagementService.manageStock(isbn, stock);
    }

    /**
     * 处理“删除图书”请求。
     *
     * @param req 原始请求
     * @return 包含操作结果的 {@link Response}
     */
    private Response<?> handleDeleteBook(Request req) {
        Map<String, Object> params = req.getParams();
        String isbn=params.get("isbn").toString();
        return bookManagementService.deleteBook(isbn);
    }

    /**
     * 处理“库存调整”请求（增量方式）。
     *
     * @param req 原始请求
     * @return 包含操作结果的 {@link Response}
     */
    private Response<?> handleManageStock(Request req) {
        Map<String, Object> params = req.getParams();
        String isbn=params.get("isbn").toString();
        int delta = getInt(params, "delta", 0);
        return  bookManagementService.manageStock(isbn,delta);
    }
}
